@echo off
setlocal enabledelayedexpansion

REM 设置标题
title UPMS和SGR数据库迁移脚本生成工具

REM 设置控制台编码为UTF-8
chcp 65001 >nul

REM 获取脚本所在目录，移除末尾的反斜杠
set "SCRIPT_DIR=%~dp0"
if "%SCRIPT_DIR:~-1%" == "\" set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%"

REM 确保脚本在解决方案根目录下的docs文件夹中运行
if not "%SCRIPT_DIR:~-4%" == "docs" (
    echo 错误：请确保脚本位于解决方案根目录下的docs文件夹中！
    echo 当前目录：%SCRIPT_DIR%
    pause
    exit /b 1
)

REM 获取解决方案根目录
set "SOLUTION_DIR=%SCRIPT_DIR%\.."

REM 规范化解决方案根目录路径
for %%I in ("%SOLUTION_DIR%") do set "SOLUTION_DIR=%%~fI"

REM 设置关键目录
set "PROJECT_DIR=%SOLUTION_DIR%\src\Apps\Sgr.Admin.WebHost"
set "UPMS_MIGRATIONS_DIR=%PROJECT_DIR%\Infrastructure\Migrations\Upms"
set "SGR_MIGRATIONS_DIR=%PROJECT_DIR%\Infrastructure\Migrations\Sgr"
set "SQL_DIR=%SOLUTION_DIR%\docs\sql"

REM 显示配置信息
echo [配置信息]
echo 脚本目录: %SCRIPT_DIR%
echo 解决方案目录: %SOLUTION_DIR%
echo 项目目录: %PROJECT_DIR%
echo UPMS迁移目录: %UPMS_MIGRATIONS_DIR%
echo SGR迁移目录: %SGR_MIGRATIONS_DIR%
echo SQL输出目录: %SQL_DIR%
echo.

REM 验证目录结构
echo [目录验证]
if not exist "%SOLUTION_DIR%\src" (
    echo 错误：未找到src目录，请确保脚本在正确的位置运行！
    pause
    exit /b 1
)

if not exist "%PROJECT_DIR%" (
    echo 错误：未找到项目目录：
    echo %PROJECT_DIR%
    pause
    exit /b 1
)

if not exist "%PROJECT_DIR%\Sgr.Admin.WebHost.csproj" (
    echo 错误：未找到项目文件！
    echo %PROJECT_DIR%\Sgr.Admin.WebHost.csproj
    pause
    exit /b 1
)

REM 验证环境
echo [环境检查]
where dotnet >nul 2>nul
if %errorlevel% neq 0 (
    echo 错误：未安装 .NET SDK 或未将其添加到 PATH！
    pause
    exit /b 1
)

dotnet ef --version >nul 2>nul
if %errorlevel% neq 0 (
    echo 错误：未安装 Entity Framework Core 工具！
    echo 请运行：dotnet tool install --global dotnet-ef
    pause
    exit /b 1
)

REM 创建必要的目录
echo -----------------------------------------------
echo                  创建目录
echo -----------------------------------------------
if not exist "%UPMS_MIGRATIONS_DIR%" (
    echo 创建UPMS迁移目录...
    mkdir "%UPMS_MIGRATIONS_DIR%" 2>nul
    if errorlevel 1 (
        echo 错误：无法创建UPMS迁移目录！
        pause
        exit /b 1
    )
)

if not exist "%SGR_MIGRATIONS_DIR%" (
    echo 创建SGR迁移目录...
    mkdir "%SGR_MIGRATIONS_DIR%" 2>nul
    if errorlevel 1 (
        echo 错误：无法创建SGR迁移目录！
        pause
        exit /b 1
    )
)

if not exist "%SQL_DIR%" (
    echo 创建SQL脚本目录...
    mkdir "%SQL_DIR%" 2>nul
    if errorlevel 1 (
        echo 错误：无法创建SQL脚本目录！
        pause
        exit /b 1
    )
)

REM 切换到项目目录
echo -----------------------------------------------
echo                  切换目录
echo -----------------------------------------------
cd /d "%PROJECT_DIR%"
if errorlevel 1 (
    echo 错误：无法切换到项目目录！
    pause
    exit /b 1
)

echo -----------------------------------------------
echo                  准备就绪
echo -----------------------------------------------
echo 当前工作目录: %CD%
echo.


REM 询问用户是否继续
set /p CONTINUE=是否开始生成迁移脚本？(Y/N)
if /i not "%CONTINUE%"=="Y" (
    echo 操作已取消。
    pause
    exit /b 0
)

echo.
echo [开始执行]

REM ===== UPMS迁移处理 =====
echo [处理UPMS迁移]
REM 检查是否存在现有UPMS迁移
if exist "%UPMS_MIGRATIONS_DIR%\*" (

    echo 删除现有UPMS迁移...
    dotnet ef migrations remove --context UpmsDbContext
    if %errorlevel% neq 0 (
        echo 错误：删除UPMS迁移失败！
        pause
        exit /b %errorlevel%
    )
    echo √ 删除UPMS迁移完成
)

echo 添加UPMS迁移...
dotnet ef migrations add InitialUpmsSchema --context UpmsDbContext --output-dir Infrastructure/Migrations/Upms
if %errorlevel% neq 0 (
    echo 错误：添加UPMS迁移失败！
    pause
    exit /b %errorlevel%
)
echo √ 添加UPMS迁移完成
echo.

REM 生成UPMS SQL脚本
echo 生成UPMS标准SQL脚本...
dotnet ef migrations script --context UpmsDbContext --output "%SQL_DIR%\upmsdb.sql"
if %errorlevel% neq 0 (
    echo 错误：生成UPMS SQL脚本失败！
    pause
    exit /b %errorlevel%
)
echo √ 生成UPMS标准SQL脚本完成

echo 生成UPMS幂等SQL脚本...
dotnet ef migrations script --idempotent --context UpmsDbContext --output "%SQL_DIR%\idempotent_upmsdb.sql"
if %errorlevel% neq 0 (
    echo 错误：生成UPMS幂等SQL脚本失败！
    pause
    exit /b %errorlevel%
)
echo √ 生成UPMS幂等SQL脚本完成
echo.

REM ===== SGR迁移处理 =====
echo [处理SGR迁移]
REM 检查是否存在现有SGR迁移
if exist "%SGR_MIGRATIONS_DIR%\*" (

    echo 删除现有SGR迁移...
    dotnet ef migrations remove --context SgrDbContext
    if %errorlevel% neq 0 (
        echo 错误：删除SGR迁移失败！
        pause
        exit /b %errorlevel%
    )
    echo √ 删除SGR迁移完成
)

echo 添加SGR迁移...
dotnet ef migrations add InitialSgrSchema --context SgrDbContext --output-dir Infrastructure/Migrations/Sgr
if %errorlevel% neq 0 (
    echo 错误：添加SGR迁移失败！
    pause
    exit /b %errorlevel%
)
echo √ 添加SGR迁移完成
echo.

REM 生成SGR SQL脚本
echo 生成SGR标准SQL脚本...
dotnet ef migrations script --context SgrDbContext --output "%SQL_DIR%\sgrdb.sql"
if %errorlevel% neq 0 (
    echo 错误：生成SGR SQL脚本失败！
    pause
    exit /b %errorlevel%
)
echo √ 生成SGR标准SQL脚本完成

echo 生成SGR幂等SQL脚本...
dotnet ef migrations script --idempotent --context SgrDbContext --output "%SQL_DIR%\idempotent_sgrdb.sql"
if %errorlevel% neq 0 (
    echo 错误：生成SGR幂等SQL脚本失败！
    pause
    exit /b %errorlevel%
)
echo √ 生成SGR幂等SQL脚本完成
echo.

echo [执行完成]
echo SQL脚本已生成到以下位置：
echo [UPMS]
echo - 标准脚本：%SQL_DIR%\upmsdb.sql
echo - 幂等脚本：%SQL_DIR%\idempotent_upmsdb.sql
echo [SGR]
echo - 标准脚本：%SQL_DIR%\sgrdb.sql
echo - 幂等脚本：%SQL_DIR%\idempotent_sgrdb.sql
echo.

pause